package com.zking.frame.lsx;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableRowSorter;

import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper;

import com.zking.db.BaseDao;

// 子面板
public class CustomerMsg extends JDialog {
	//美化包
		{
			try {
			 BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.osLookAndFeelDecorated;
				org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	private List<String> sonlists = new ArrayList<String>();// 子面板的内容
	private List<String> addslists =new ArrayList<String>();// 接收字面板的参数重新填入面板
	// 列表头文件
	String [] columnNams = {"编号","客户名称","拼音码","城市",
			"地址","账号","电话","开户行","邮政编码","传真","Email","联系手机",
			"联系人","期初应收","期初应付","性别","余额","折扣","创建时间","修改时间","VIP"};
	private int rowCount;// 数据库行
	private int columnCount;// 数据库列
	private String[][] str;// 数据
	private int id;// 编号
	private int num;// 账号的尾号
	private JPanel pl_north;// 上部面板
	
	private Font font;// 字体大小
	private JLabel customer;// 客户标签
	private JTextField tf_name;// 填写客户名的文本框
	
	private JButton bt_charge;// 充值
	private JTextField tf_charge;// 充值文本
	private JButton bt_search;// 查询按钮
	private JButton bt_insert;// 新增按钮
	private JButton bt_updata;// 修改按钮
	private int selectRow;// 鼠标选定的行号
	
	private JPanel pl_center;// 中部面板
	private JTable tb_Msg;// 表格
	private DefaultTableModel dtm;// 表格模型
	private JScrollPane sp;// 滚动面板
	
	private static final long serialVersionUID = 1L;
	@SuppressWarnings("serial")
	public CustomerMsg(JFrame owner,boolean modal){
		super(owner,modal);
		Container c=getContentPane();
		c.setLayout(new BorderLayout());// 边界布局
		// 数据库数据==>面板
		if(exchangeData()!=0)
		   num=Integer.parseInt(str[rowCount-1][0])+1;
		
		// 上部面板
		pl_north = new JPanel(new GridBagLayout());// 上部面板为网格布局
		c.add(pl_north,"North");
		font = new Font("楷书", Font.BOLD, 18);
		Color color_North = new Color(148, 174, 198);// 上部面板的背景色
		pl_north.setBackground(color_North);
		pl_north.setPreferredSize(new Dimension(0, 50));
		GridBagConstraints gbc = new GridBagConstraints();// 网格布局设计图
		
		customer = new JLabel("所有客户");
		customer.setPreferredSize(new Dimension(150, 30));
		customer.setFont(font);
		gbc.gridwidth=1;// 设置为1表示这一行没有结束，下次还能继续添加
		gbc.gridx=1;// 第1列
		gbc.gridy=1;// 第1行
		pl_north.add(customer,gbc);
		
		JLabel lb0 = new JLabel();// 填充面板
		gbc.gridwidth=1;// 设置为1表示这一行没有结束，下次还能继续添加
		gbc.gridx=2;// 第2列
		gbc.gridy=1;// 第1行
		lb0.setPreferredSize(new Dimension(550, 20));
		pl_north.add(lb0,gbc);
		
		bt_charge = new JButton("充值：");
		bt_charge.setPreferredSize(new Dimension(100, 30));
		bt_charge.setFont(font);
		gbc.gridx=3;// 第3列
		gbc.gridy=1;// 第1行
		pl_north.add(bt_charge,gbc);
		// 充值
		bt_charge.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				double price;
				if ((selectRow=tb_Msg.getSelectedRow())!=-1) {
					price=addStrings(tf_charge.getText(), dtm.getValueAt(selectRow, columnNams.length-5)+"");
					if (tf_charge.getText()==null||"".equals(tf_charge.getText())) {
						JOptionPane.showMessageDialog(CustomerMsg.this,"充值金额不能为空");
					}else if (price==-1){
						JOptionPane.showMessageDialog(CustomerMsg.this,"请输入数字");
					}else{
					dtm.setValueAt(price,selectRow,columnNams.length-5 );// 余额所在位置columnNams.length-5
					// 更新语句
					BaseDao base=new BaseDao();
					int idNum = Integer.parseInt(str[selectRow][0]);
					String sql="update client set balance=? where id=?";
			    	try {
						base.update(sql,price,idNum);
						JOptionPane.showMessageDialog(CustomerMsg.this,"充值成功");
					} catch (SQLException e1) {
						e1.printStackTrace();
					}finally{
						try {
							base.closeConnection();
						} catch (SQLException e1) {
							e1.printStackTrace();
						}
					}
					}
				} else {
					JOptionPane.showMessageDialog(CustomerMsg.this,"请选中所需充值的客户");// 未选中时弹窗提示
				}
				tf_charge.setText("");
			}
		});
		
		JLabel lb1 = new JLabel();
		gbc.gridwidth=1;// 设置为1表示这一行没有结束，下次还能继续添加
		gbc.gridx=4;// 第4列
		gbc.gridy=1;// 第1行
		lb1.setPreferredSize(new Dimension(15, 20));
		pl_north.add(lb1,gbc);
		
		tf_charge = new JTextField();
		tf_charge.setPreferredSize(new Dimension(100, 25));
		tf_charge.setFont(font);
		gbc.gridx=5;// 第5列
		gbc.gridy=1;// 第1行
		pl_north.add(tf_charge,gbc);
		
		JLabel lb2 = new JLabel("元");
		lb2.setFont(font);
		gbc.gridwidth=1;// 设置为1表示这一行没有结束，下次还能继续添加
		gbc.gridx=6;// 第6列
		gbc.gridy=1;// 第1行
		lb2.setPreferredSize(new Dimension(100, 20));
		pl_north.add(lb2,gbc);
		
		tf_name = new JTextField();
		tf_name.setPreferredSize(new Dimension(150, 30));
		tf_name.setFont(font);
		gbc.gridwidth=1;// 设置为1表示这一行没有结束，下次还能继续添加
		gbc.gridx=7;// 第7列
		gbc.gridy=1;// 第1行
		pl_north.add(tf_name,gbc);

		bt_search = new JButton("查询");
		bt_search.setPreferredSize(new Dimension(100, 30));
		bt_search.setFont(font);
		gbc.gridwidth=1;// 0表示添加结束
		gbc.gridx=8;// 第8列
		gbc.gridy=1;// 第1行
		pl_north.add(bt_search,gbc);
		bt_search.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				//这里是关键
				TableRowSorter<DefaultTableModel> sorter =new TableRowSorter<DefaultTableModel>(dtm);
				tb_Msg.setRowSorter(sorter);
				//实现过滤，search为正则表达式，该方法支持参数为null和空字符串，因此不用对输入进行校验
				String search =tf_name.getText();
				sorter.setRowFilter(RowFilter.regexFilter(search));
			}
		});
		
		bt_insert = new JButton("新增");
		bt_insert.setPreferredSize(new Dimension(100, 30));
		bt_insert.setFont(font);
		gbc.gridwidth=1;// 设置为1表示这一行没有结束，下次还能继续添加
		gbc.gridx=9;// 第9列
		gbc.gridy=1;// 第1行
		pl_north.add(bt_insert,gbc);
		bt_insert.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				String [] rowData=new String[columnNams.length];// 一行的数目
				new AddCustomer(CustomerMsg.this, true, addslists,num);
				if (addslists.isEmpty()) {
					JOptionPane.showMessageDialog(CustomerMsg.this, "添加失败");
				}else{
					num++;
					// 刷新数据库
					exchangeData();
					rowData[0]=str[rowCount-1][0];
					// 将list转化成数组添加道主面板
					rowData[1] = addslists.get(0);
					rowData[2] = addslists.get(1);
					rowData[3] = addslists.get(2);
					rowData[4] = addslists.get(3);
					rowData[5] = addslists.get(4);
					
					rowData[6] = addslists.get(5);
					rowData[7] = addslists.get(6);
					rowData[8] = addslists.get(7);
					rowData[9] = addslists.get(8);
					rowData[10] = addslists.get(9);
					
					rowData[11] = addslists.get(10);
					rowData[12] = addslists.get(11);
					rowData[13] = addslists.get(12);
					rowData[14] = addslists.get(13);
					rowData[15] = addslists.get(14);
					
					rowData[16] = "0.0";
					rowData[17] = addslists.get(15);
					rowData[18] = addslists.get(16);
					rowData[19] = "";
					rowData[20] = addslists.get(17);
					
				dtm.addRow(rowData);// 添加到后面一行
				JOptionPane.showMessageDialog(CustomerMsg.this, "添加成功");
				}
			}
		});
		
		bt_updata = new JButton("修改");
		bt_updata.setPreferredSize(new Dimension(100, 30));
		bt_updata.setFont(font);
		gbc.gridx=10;// 第10列
		gbc.gridy=1;// 第1行
		pl_north.add(bt_updata,gbc);
		bt_updata.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if((selectRow=tb_Msg.getSelectedRow())!=-1){
					// 获取id
					id = Integer.parseInt(str[selectRow][0]);
					// selectRow选中的行号
					String updateStr[]=updateData(id);// 这一行所需的数组
					for(int i=0;i<updateStr.length;i++){// i=1是因为修改时，编号不修改
						sonlists.add(updateStr[i]);//获取选中行的所有数据
					}
					UpdateMsg u=new UpdateMsg(CustomerMsg.this, true,sonlists,id);
					if (u.things==1) {
						// 修改后的数据添加到主面板->刷新主面板要修改的那一行
							dtm.setValueAt(sonlists.get(0),selectRow,1);//selectRow行+j+1列 内容：sonlists.get(j)
							dtm.setValueAt(sonlists.get(1),selectRow,2);//selectRow行+j+1列 内容：sonlists.get(j)
							dtm.setValueAt(sonlists.get(2),selectRow,3);//selectRow行+j+1列 内容：sonlists.get(j)
							dtm.setValueAt(sonlists.get(3),selectRow,4);//selectRow行+j+1列 内容：sonlists.get(j)
							dtm.setValueAt(sonlists.get(4),selectRow,7);//selectRow行+j+1列 内容：sonlists.get(j)
							
							dtm.setValueAt(sonlists.get(5),selectRow,6);//selectRow行+j+1列 内容：sonlists.get(j)
							dtm.setValueAt(sonlists.get(6),selectRow,8);//selectRow行+j+1列 内容：sonlists.get(j)
							dtm.setValueAt(sonlists.get(7),selectRow,9);//selectRow行+j+1列 内容：sonlists.get(j)
							dtm.setValueAt(sonlists.get(8),selectRow,10);//selectRow行+j+1列 内容：sonlists.get(j)
							dtm.setValueAt(sonlists.get(9),selectRow,12);//selectRow行+j+1列 内容：sonlists.get(j)
							
							dtm.setValueAt(sonlists.get(10),selectRow,11);//selectRow行+j+1列 内容：sonlists.get(j)
							dtm.setValueAt(sonlists.get(11),selectRow,17);//selectRow行+j+1列 内容：sonlists.get(j)
							dtm.setValueAt(sonlists.get(12),selectRow,20);//selectRow行+j+1列 内容：sonlists.get(j)
							dtm.setValueAt(sonlists.get(13),selectRow,19);//selectRow行+j+1列 内容：sonlists.get(j)
						// 清楚上一次的记录
						JOptionPane.showMessageDialog(CustomerMsg.this, "修改成功");
						sonlists.clear();
					}else if(u.things==2){
						dtm.removeRow(selectRow);//移除这一行
						JOptionPane.showMessageDialog(CustomerMsg.this, "删除成功");
					}
					else if(u.things==3){
						JOptionPane.showMessageDialog(CustomerMsg.this, "未修改");
					}
				}else {
					JOptionPane.showMessageDialog(CustomerMsg.this,"请选中所需修改的库单");// 未选中时弹窗提示
				}
			}
		});
		
		// 中部面板
		pl_center = new JPanel(new BorderLayout());
		c.add(pl_center,"Center");
		// 添加行和列
		dtm = new DefaultTableModel(str,columnNams);
		tb_Msg = new JTable(dtm){
			@Override
			public boolean isCellEditable(int row, int column) {
				return false;// 表格不允许编制
			}
		};
		// 表头
		JTableHeader head = tb_Msg.getTableHeader();
		// 表头颜色设置
		Color color_tableHeader = new Color(222, 231, 239);
		head.setBackground(color_tableHeader);
		// 设置表头大小
		head.setPreferredSize(new Dimension(head.getWidth(), 40));
		// 设置每个格子的高度
		tb_Msg.setRowHeight(30);
		// 表格添加到滚动面板
		sp = new JScrollPane(tb_Msg);
		// 水平
		sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		pl_center.add(sp);
		
		setSize(1500, 900);// 大小放在最前面
		setTitle("客户基本资料");// 标题
		setLocationRelativeTo(owner);// 窗口居中
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);// 窗口可关闭
		setVisible(true);// 可见
	}
	/**
	 * @param余额相加
	 * @param num1充值金额 
	 * @param num2余额
	 * @return
	 */
	public double addStrings(String num1,String num2){
		double value1;
		double value2;
		double value;
		if (num2==null||"".equals(num2)||num2.isEmpty()) {
			num2="0";
		}
		try {
			value1= Double.valueOf(num1.toString());
			value2 = Double.valueOf(num2.toString());
			value = value1+value2;
		} catch (Exception e2) {
			return -1;
		}
		return value;
	}
	/**
	 * @param定义数组的大小
	 * @param把结果集中的每一行数据都转成一个对象数组object[]
	 * @param将list==>数组String str[][]
	 */
	public int exchangeData(){
		BaseDao base=new BaseDao();
		// 查询语句
		String sql="select * from client";
		// 数据集合
		List<Object[]> data=null;
		try {
			data = base.queryArrayListHandler(sql);
			if(data.size()==0) return 0;
			// 获取数据库行和列 
			rowCount=data.size();
			
			columnCount = data.get(0).length;
			// 设置为数组大小
			str=new String[rowCount][columnCount];
			// 将list中的集合装化成数组String str[]
			for(int i=0;i<data.size();i++) {
				for(int j=0;j<data.get(i).length;j++)
					if (data.get(i)[j]!=null) {
						str[i][j]=data.get(i)[j]+"";
					} else {
						str[i][j]="";
					}
			}
			return 1;
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				// 关闭连接
				base.closeConnection();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return 0;
	}
	
	/**
	 * @param定义数组的大小
	 * @param把结果集中的每一行数据都转成一个对象数组object[]
	 * @param将list==>数组String str1[]
	 */
	public String[] updateData(int selcetId ){
		// 设置为数组大小
		String []str1=new String[14];
		BaseDao base=new BaseDao();
		// 查询语句
		String sql="select name,pinYinCode,city,address,discount,"
				+ "isVip,bankOfDeposit,tel,postalCode,fax,"
				+ "e_mail,contactPerson,contactTel from client where id="+selcetId;
		// 数据集合
		Object[] data=null;
		try {
			data = base.queryArrayHandler(sql);
			// 获取数据库行和列
			rowCount=data.length;
			for(int i=0;i<data.length;i++) {
					if (data[i]!=null) {
						str1[i]=data[i]+"";
					} else {
						str1[i]="";
					}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				// 关闭连接
				base.closeConnection();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return str1;
	}
	public static void main(String[] args) {
		new CustomerMsg(null, true);
	}	
}
